iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 17
1

關連:多對多
這裡舉的例子是第 16 天舉的例子,每家飲料店可以賣很多及不同的飲料。但是,實際情況是,以珍珠奶茶來講,很多飲料店都會賣,以嚴謹的角度來看,其實是多對多的關聯。所以,用一句話來講每家飲料店除了可以賣很多種飲料之外,每種飲料也可以在很多家飲料店販售。

這種狀況是很常見的,沒辦法單純的在兩邊的 Model 設定 has_many 或 belongs_to 就搞定,多對多的關連通常會需要一個第三方的資料表來存放這兩邊 Model 的資訊,也就是這個例子裡「飲料店菜單」的概念。

第一步,我們先建立 Model:
我們先建立一個專門存放 DrinkStore 跟 Drink 這兩邊資訊的 Model。

Model 名稱 DrinkStoreMenu。
https://ithelp.ithome.com.tw/upload/images/20190918/20112656IvRYZk7bO1.png

使用 Rails 的 Model 產生器來產生 DrinkStoreMenu,請在終端機輸入:
rails g Model DrinkStoreMenu drink_store:references drink:references
最後別忘記執行 rails db:migrate

補充說明,在產生關聯時,可以使用 drink_store:references or drink_store_id:integer 兩種寫法,但 references 的寫法會多做幾件事:

  1. 自動加上索引 (index),加快查詢速度。
  2. 自動幫 Model 加上 belongs_to.
    再次提醒,最後別忘記執行 rails db:migrate
# 檔案:app/models/drink_store_menu.rb
class DrinkStoreMenu < ApplicationRecord
  belongs_to :drink_store
  belongs_to :drink
end

因為使用 references 的寫法,所以自動有幫你補上這兩行 belongs_to 方法,但如果沒有也沒關係,自己手動輸入即可。

# 檔案:app/models/drink_store.rb
class DrinkStore < ApplicationRecord
  belongs_to :user

  has_many :drink_store_menus
  has_many :drinks, through:  :drink_store_menus
end
# 檔案:app/models/drink.rb
class Drink < ApplicationRecord
  has_many :drink_store_menus
  has_many :drink_stores, through:  :drink_store_menus
end

上一篇
[Day16] Ruby on Rails - Model 關聯性,一對多
下一篇
[Day18] Ruby on Rails - Model 關聯性, 參數補充說明
系列文
Junior Ruby on Rails 工程師的心得與自我挑戰 30 天 (單身狗轉移注意力之歷練)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言